#ifndef MODIFIED_MOORE_3D_1_H
#define MODIFIED_MOORE_3D_1_H

#include "grid.h"
#include <vector>

namespace mvnn
{
    //Na pierwszym poziomie zwraca sasiadow wg Moore'a, na drugim wg von Neumana (włączając komórkę środkową)
    // 8+1+4 sąsiadów

    std::vector<int> neighbours(Grid* (&g),const int& i,const int& j)
    {
        // N, NE, E, SE, S, SW, W, NW, TOP, N-TOP, E-TOP, S-TOP, W-TOP
        std::vector<int> v(13);
        int width=g->size(0);
        int height=g->size(1);
        if(i>0)
        {

            v[0]=g->get(i-1,j); //N
            v[9]=g->get(i-1,j,1);//N-TOP
        }
        else
        {
            v[0]=-1; //N
            v[9]=-1; //N-TOP
        }
        if(j<width-1 && i>0)
        {
            v[1]=g->get(i-1,j+1);;//NE
        }
        else
        {
            v[1]=-1;
        }
        if(j<width-1)
        {

            v[2]=g->get(i,j+1);//E
            v[10]=g->get(i,j+1,1);//E-TOP
        }
        else
        {
            v[2]=-1;//E
            v[10]=-1;//E-TOP
        }
        if(j<width-1 && i<height-1)
        {
            v[3]=g->get(i+1,j+1);//SE
        }
        else
        {
            v[3]=-1;
        }
        if(i<height-1)
        {
            v[4]=g->get(i+1,j);//S
            v[11]=g->get(i+1,j,1);//S-TOP
        }
        else
        {
            v[4]=-1;//S
            v[11]=-1;//S-TOP
        }
        if(j>0 && i<height-1)
        {
            v[5]=g->get(i+1,j-1);//SW
        }
        else
        {
            v[5]=-1;
        }
        if(j>0)
        {
            v[6]=g->get(i,j-1);//W
            v[12]=g->get(i,j-1,1);//W-TOP
        }
        else
        {
            v[6]=-1;//W
            v[12]=-1;//W-TOP
        }
        if(i>0 && j>0)
        {
            v[7]=g->get(i-1,j-1);//NW
        }
        else
        {
            v[7]=-1;
        }
        v[8]=g->get(i,j,1);//top
        return v;
    }
}

#endif // MODIFIED_MOORE_3D_1_H
